Apache Mahout 入门篇

author: sheng junhui

weibo: @armysheng

blog: youngfor.me

email: armysheng@Gmail.com

转载请注明出处


0. 基本概念的介绍

在搭建开发环境know how的步骤前,最好是先做一些konw what的学习,这里先简单介绍一下一些基本的概念。

0.1 什么是Mahout?

Apache Mahout 翻译成中文是骑大象的人,或驯象师。这里是指Apache开源社区维护的一个可伸缩(Scable)的机器学习库。Mahout机器学习库*目前实现的算法*包括协同滤波,分类,聚类,特征降维等等。我们知道Hadoop的logo是一头大象,而Mahout要做的就是驯服这头大象。Mahout致力于提供可支持超大数据集,支持商业使用的开源机器学习库,并且构建充满活力的开源社区。---Mahout 主页 Hadoop Mahout

0.2 Mahout又是一个Maven项目,Maven又是什么呢?

Apache Maven,是一个软件(特别是Java软件)项目管理及自动构建工具,由Apache软件基金会所提供。基于项目对象模型(缩写:POM)概念,Maven利用一个中央信息片断能管理一个项目的构建、报告和文档等步骤。项目对象模型存储在命名为 pom.xml 的文件中。POM 文件中包含了它的配置信息,依赖信息等等。---Maven wiki

所以,Mahout是一个用java语言开发的,Maven管理工具管理的Maven project,因此整个过程也需要安装Maven。事实上,安装完java, Maven, Mahout 以后,不需要eclipse,整个Mahout机器学习库已经可以被完整的调用,也可以在此基础上进行开发。而eclipse是一个业界广泛使用的IDE,在eclipse上让人得心应手,而且eclipse对Maven项目也有很好的支持,只需要装上M2E插件便可以非常方便的使用。


1. 安装

首先介绍一下开发环境:Win7 32位系统 需要安装的软件: jdk1.7.0_60 +apache-maven-3.2.1+TortoiseSVN 1.8.7+mahout-distribution-0.9(源码&&包) 由于我们公司内部走的是代理网络,所以部分工具安装完成使用前,都会介绍如何配置代理信息,如果你使用的是直连网络,请忽视这些段落。

1.1 Java环境的安装

我们选择的java版本是jdk1.7.0_60,可以在oracle主页下载,这里不建议使用java8,在编译过程中可能会出现一些不必要的问题。java安装比较简单,直接下载二进制文件进行安装。我们安装在D:\Program Files\Java\jdk1.7.0_60,安装完成后在控制命令行中输入:

1
2
3
4
C:\Users\shengjh>java -version
java version "1.7.0_60"
Java(TM) SE Runtime Environment (build 1.7.0_60-b19)
Java HotSpot(TM) Client VM (build 24.60-b09, mixed mode, sharing)

看似java已经可以运行,其实java的环境变量尚未加入,而是在安装过程中,将java.exe,javaw.exe,javawc.exe 三个文件copy到了system32目录下。所以我们需要手动添加环境变量: 右键计算机->属性->高级系统设置->环境变量->系统变量->新建 变量名:JAVA_HOME 变量值:D:\Program Files\Java\jdk1.7.0_60 Path 这一步非常重要,不做的话再Maven的安装上,会出现JAVA_HOME找不到的错误,至此我们完成了JAVA环境的配置。

1.2 Maven环境搭建

Maven 是一个项目管理和构建自动化工具。但是对于我们程序员来说,我们最关心的是它的项目构建功能。所以这里我们介绍的就是怎样用 maven 来满足我们项目的日常需要。 Maven 使用惯例优于配置的原则 。它要求在没有定制之前,所有的项目都有如下的结构:

目录 目的
${basedir} 存放 pom.xml和所有的子目录
${basedir}/src/main/java 项目的 java源代码
${basedir}/src/main/resources 项目的资源,比如说 property文件
${basedir}/src/test/java 项目的测试类,比如说 JUnit代码
${basedir}/src/test/resources 测试使用的资源

一个 maven 项目在默认情况下会产生 JAR 文件,另外 ,编译后 的 classes 会放在 ${basedir}/target/classes 下面, JAR 文件会放在 ${basedir}/target 下面。 在确保JAVA环境已经搭建好的情况下我们开始安装Maven,可以从Maven的主页下载二进制文件,这里我们选择的是Maven 3.2.1,并解压到你常用的软件路径,这里我们安装在D:\Program Files\apache-maven-3.2.1\。该页的最后也该处了Maven的安装方法。这里我们使用最简单的将Maven的bin路径D:\Program Files\apache-maven-3.2.1\bin加入到系统变量Path中: Path 完成后在命令行中输入mvn --version 查看maven的版本: Path

代理配置

之前介绍了代理的问题,因为后续的操作,maven会自动联网搜索依赖包,这里在继续操作之前先介绍Maven的代理配置。 在Maven的配置文件都在它的安装目录下的\config\setting.xml文件中<proxies>字段定义了代理的设置。根据代理情况修改Host,port,username,password等等。这里我们只修改了host和port。 Path

接下来我们用 maven 来建立最著名的“Hello World!”程序,来更好的了解Maven。 **注意:**如果你是第一次运行 maven,你需要 Internet 连接,因为 maven 需要从网上下载需要的插件。
我们要做的第一步是建立一个 maven 项目。在 maven 中,我们是执行 maven 目标 (goal) 来做事情的。 maven 目标和 ant 的 target 差不多。在命令行中执行下面的命令来建立我们的 hello world 项目

1
mvn archetype:create -DgroupId=com.`mycompany.app -DartifactId=my-app

Path 命令执行完后你将看到maven生成了一个名为my-app的目录,这个名字就是你在命令中指定的artifactId,进入该目录,你将发现以下标准的项目结构: Path 其中:src/main/java 目录包含了项目的源代码,src/test/java 目录包含了项目的测试代码,pom.xml是项目的项目对象模型(Project Object Model or POM)。 之后我们输入cd my-app进入该项目 再输入mvn package 回车来build这个项目,得到,折后target目录下回生成该项目的类文件和包: Path 接着你可以使用以下的命令来测试新编译和打包出来的jar包,

1
java -cp target/my-app-1.0-SNAPSHOT.jar com.mycompany.app.App

Path 至此Maven的安装和介绍就到这里,这一章节主要参考了Apache Maven 入门篇 ( 上 )maven 教程一 入门,以及Maven主页,阅读原文获得更多的了解。

1.3 Mahout源码的编译

Mahout的源码和编译后的包可以从Mahout官网上获得,然而在使用这里下载的0.9发行版源码时,somehow遇到了一些错误。 这里我们选择用SVN获得它最新的源码。Tortoise SVN是大家常用的代码托管工具,可以从它的主页上下载到。 安装完成后,在使用之前,我们还要对他做一下代理配置。

代理配置

SVN的代理配置只需要打开,在开始按钮->程序->Tortoise SVN->settings,找到Network项进行如下配置: Path

接着我们就可以开始编译源码了 首先得到源码,在命令行输入:

1
svn co http://svn.apache.org/repos/asf/mahout/trunk

cd trunk并编译:

1
2
3
4
5
# With hadoop-1.2.1 dependency
mvn clean install
# With hadoop-2.2.0 dependency
mvn -Dhadoop2.version=2.2.0 clean install

这里可以选择Hadoop依赖版本,在没有hadoop的情况下,也可以编译。 编译时经常会遇见Test failure的error而卡住,关于这个问题,是由于mahout中有大量的测试例子,test failure是遇到了broken unit test.遇到这种问题要么需要自己去定位修复这个broken test,要么可以等待官方发行并update svn 进行修复。关于这个问题参加这里,一般的解决方法是使用:

1
2
3
4
5
# With hadoop-1.2.1 dependency
mvn -DskipTests clean install
# With hadoop-2.2.0 dependency
mvn -Dhadoop2.version=2.2.0 -DskipTests clean install

这里我们选的是

1
mvn -DskipTests clean install

最后得到结果: Path

至此,Mahout的源码就编译完毕,我们可以看到每个Mahout源码的目录下都生成了相应的target文件,包含对应的类和.jar包。 Path

1.4 如何在Eclipse上使用Mahout?

编译完后的mahout还是不能在eclipse上使用,下面我们介绍一下如何在eclipse下开发Maven project。

首先Eclipse版本选择,关于eclipse的版本代号问题请参考这里。 我们选择的是Eclipse IDE for Java EE Developers(JUNO),它包含了Maven所需的一些依赖包。Eclipse standard (Indigo)由于缺乏依赖包,在安装上Maven插件上会有问题。eclipse安装包可以在官网下载。

代理配置

eclipse安装完成后,启动会自动检测本机的代理设置,将本机的代理设置填到软件设置界面。但是如果你想修改的话可以在下面找到: eclipse->windows->perferences->general->Network Connection Path

接着我们介绍一下m2eclipse插件和它的安装方法。m2eclipse插件是一款一流的支持Apache Maven的eclipse插件。用户可以用它更方便的编辑Maven的pom.xml文件,可以在IDE上build一个Maven工程。

启动eclipse定位到 Help -> Install New Software… 点击Add,分别填入:

Name:m2e

Location:http://download.eclipse.org/technology/m2e/releases Path 点击next,同意协议,确认warning后安装。安装完成后,eclipse会提示你重启。

安装完成后我们还需要做一些设置 定位到 eclipse -> windows -> preference -> Maven ->Installations 将本地的Maven路径Add进来。 PathUser-setting 定位到Maven安装路径下的.\conf\setting.xml文件。 这样我们就完成了插件的安装,我们便可以Import我们之前已经编译好的Mahout源码,在eclipse下方便的查看Mahout的类文件。 Path 导入时可能会遇到Maven-scala-plugin缺失的情况,点击finish 会自动找到缺失的plugin并且安装(需重启eclipse)。 Path 导入buliding workspace 后,提示了有错误:

error:Plugin execution not covered by lifecycle configuration: org.scala-tools:maven-scala-plugin:2.15.2:testCompile (execution: default, phase: test-compile)

Path

这是由于m2eclipse-scala插件的缺失,The default maven plugin does not support Scala out of the box, so you need to install the m2eclipse-scala connector. 即m2eclipse-scala connector 的缺失。所以我们需要再次安装这个插件,方法和上面的类似。 Add: Name: Maven for Scala Location:http://alchim31.free.fr/m2e-scala/update-site/ Path (若错误持续,则右键改project-> Maven -> Update Project)

最后我们成功的导入Mahout源码到了eclipse中。 Path


2. 简单推荐算法的实现

接着我们介绍如何用Mahout来建立简单的推荐算法,大部分过程我们follow了官方的这个quick guide

Step 0:创建数据集,命名为Dataset.csv,内容如下:

1,10,1.0
1,11,2.0
1,12,5.0
1,13,5.0
1,14,5.0
1,15,4.0
1,16,5.0
1,17,1.0
1,18,5.0
2,10,1.0
2,11,2.0
2,15,5.0
2,16,4.5
2,17,1.0
2,18,5.0
3,11,2.5
3,12,4.5
3,13,4.0
3,14,3.0
3,15,3.5
3,16,4.5
3,17,4.0
3,18,5.0
4,10,5.0
4,11,5.0
4,12,5.0
4,13,0.0
4,14,2.0
4,15,3.0
4,16,1.0
4,17,4.0
4,18,1.0

Step 1: 新建一个Maven Project,选择simple project Path

Step 2: 命名为UBrecommender Path

Step 3:打开pom.xml文件,加入Mahout的依赖配置,并将Dataset.csv放到工程目录下

1
2
3
4
5
6
7
8
<dependencies>
<dependency>
<groupId>org.apache.mahout</groupId>
<artifactId>mahout-core</artifactId>
<version>0.9</version>
</dependency>
</dependencies>

Path

Step 4: 在src\main\java\下新建SampleRecommender.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import java.io.File;
import java.io.IOException;
import org.apache.mahout.cf.taste.impl.model.file.FileDataModel;
import org.apache.mahout.cf.taste.impl.neighborhood.ThresholdUserNeighborhood;
import org.apache.mahout.cf.taste.impl.recommender.GenericUserBasedRecommender;
import org.apache.mahout.cf.taste.impl.similarity.PearsonCorrelationSimilarity;
import org.apache.mahout.cf.taste.model.DataModel;
import org.apache.mahout.cf.taste.neighborhood.UserNeighborhood;
import org.apache.mahout.cf.taste.recommender.RecommendedItem;
import org.apache.mahout.cf.taste.recommender.UserBasedRecommender;
import org.apache.mahout.cf.taste.similarity.UserSimilarity;
import java.util.List;
public class SampleRecommender
{
public static void main(String[] args) throws IOException, Exception{
DataModel model = new FileDataModel (new File("dataset.csv"));
UserSimilarity similarity = new PearsonCorrelationSimilarity(model);
UserNeighborhood neighborhood = new ThresholdUserNeighborhood(0.1, similarity, model);
UserBasedRecommender recommender = new GenericUserBasedRecommender(model, neighborhood, similarity);
List<RecommendedItem> recommendations = recommender.recommend(2,3);
for (RecommendedItem recommendation : recommendations) {
System.out.println(recommendation);
}
}
}

Step 5: 运行项目,run as java application 我们便得到推荐结果:

RecommendedItem[item:12, value:4.8328104]
RecommendedItem[item:13, value:4.6656213]
RecommendedItem[item:14, value:4.331242]

至此我们便完成了简单的一个推荐算法。

总结

总结来说我们安装了jdk,安装了Maven,安装了Eclipse以及在eclipse上使用Maven所需的一些插件,最后我们能够顺利地查看和修改Mahout的源码。

**Tips:**环境配置中会遇到许多问题,请多谷歌,国内如果访问不够顺畅,请直接使用一些谷歌的服务器IP来流畅访问,你也可以将浏览器的默认搜索改为这个地址。

请我喝杯咖啡吧!